package com.example.demo;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

import com.qihoo.gamecenter.sdk.activity.ContainerActivity;
import com.qihoo.gamecenter.sdk.common.IDispatcherCallback;
import com.qihoo.gamecenter.sdk.matrix.Matrix;
import com.qihoo.gamecenter.sdk.protocols.ProtocolConfigs;
import com.qihoo.gamecenter.sdk.protocols.ProtocolKeys;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                doSdkLogin(false);
            }
        });

        findViewById(R.id.button2).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                doSdkSwitchAccount(false);
            }
        });
        findViewById(R.id.button3).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                doSdkPay(false, true);
            }
        });

    }

    /**
     * * 使用360SDK的登录接口 * *
     * 
     * @param isLandScape
     *            是否横屏显示登录界面
     */
    protected void doSdkLogin(boolean isLandScape) {
        Bundle bundle = new Bundle(); // 界面相关参数，360SDK界面是否以横屏显示。
        bundle.putBoolean(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE, isLandScape); // 可选参数，登录界面的背景图片路径，必须是本地图片路径
        bundle.putString(ProtocolKeys.UI_BACKGROUND_PICTRUE, ""); // *** 以下非界面相关参数 *** // 必需参数，使用360SDK的登录模块。
        bundle.putInt(ProtocolKeys.FUNCTION_CODE, ProtocolConfigs.FUNC_CODE_LOGIN);
        Intent intent = new Intent(this, ContainerActivity.class);
        intent.putExtras(bundle);
        Matrix.invokeActivity(this, intent, new IDispatcherCallback() {
            @Override
            public void onFinished(String data) {
                procGotTokenInfoResult(data);
            }
        });
    }

    String access_token = "";
    boolean isAccessTokenValid = false;

    /** * 处理Token返回 * @param data */
    private void procGotTokenInfoResult(String data) {
        boolean isCallbackParseOk = false;
        if (!TextUtils.isEmpty(data)) {
            Log.d("data", data);

            JSONObject jsonRes;
            try {
                jsonRes = new JSONObject(data);
                // error_code 状态码： 0 登录成功， -1 登录取消， 其他值：登录失败
                int errorCode = jsonRes.optInt("error_code");
                String dataString = jsonRes.optString("data");

                switch (errorCode) {
                case 0:
                    TokenInfo tokenInfo = TokenInfo.parseJson(dataString);
                    if (tokenInfo != null && tokenInfo.isValid()) {
                        isCallbackParseOk = true;
                        isAccessTokenValid = true;
                        onGotTokenInfo(tokenInfo);
                    }
                    break;
                case -1:
                    Toast.makeText(this, "取消登录", Toast.LENGTH_SHORT).show();
                    return;
                default:
                    if (!TextUtils.isEmpty(dataString)) {
                        Toast.makeText(this, dataString, Toast.LENGTH_SHORT).show();
                    }
                    break;
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        if (!isCallbackParseOk) {
            Toast.makeText(this, "failfailfailfailfailfailfailfailfailfailfailfailfail", Toast.LENGTH_LONG).show();
        }
    }

    private void onGotTokenInfo(TokenInfo tokenInfo) {
        // TODO Auto-generated method stub

        access_token = tokenInfo.getAccess_token();

        this.getSharedPreferences("access_token", Context.MODE_PRIVATE).edit()
                .putString("access_token", tokenInfo.getAccess_token()).commit();

    }

    public static final String TAG = "mainactivity";

    /** * 使用360SDK的切换账号接口 * * @param isLandScape 是否横屏显示登录界面 */
    protected void doSdkSwitchAccount(boolean isLandScape) {
        Bundle bundle = new Bundle(); // 界面相关参数，360SDK界面是否以横屏显示。
        bundle.putBoolean(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE, isLandScape); // 可选参数，登录界面的背景图片路径，必须是本地图片路径
        bundle.putString(ProtocolKeys.UI_BACKGROUND_PICTRUE, ""); // *** 以下非界面相关参数 *** // 必需参数，使用360SDK的切换账号模块。
        bundle.putInt(ProtocolKeys.FUNCTION_CODE, ProtocolConfigs.FUNC_CODE_SWITCH_ACCOUNT);
        Intent intent = new Intent(this, ContainerActivity.class);
        intent.putExtras(bundle);
        Matrix.invokeActivity(this, intent, new IDispatcherCallback() {
            @Override
            public void onFinished(String data) {
                Log.d(TAG, "mAccountSwitchCallback, data is " + data);
                procGotTokenInfoResult(data);
            }
        });
    }

    /**
     * * 使用360SDK的支付接口 *
     * 
     * @param isLandScape
     *            是否横屏显示支付界面 *
     * @param isFixed
     *            是否定额支付
     */
    protected void doSdkPay(final boolean isLandScape, final boolean isFixed) {
        if (!isAccessTokenValid) {
            Toast.makeText(this, "R.string.access_token_invalid", Toast.LENGTH_SHORT).show();
            return;
        }
        // 支付基础参数
        Intent intent = getPayIntent(isLandScape, isFixed); // 必需参数，使用360SDK的支付模块。
        intent.putExtra(ProtocolKeys.FUNCTION_CODE, ProtocolConfigs.FUNC_CODE_PAY); // 可选参数，登录界面的背景图片路径，必须是本地图片路径
        intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE, "");
        Matrix.invokeActivity(this, intent, mPayCallback);
    }

    /**
     * * 生成调用360SDK支付接口基础参数的Intent * *
     * 
     * @param isLandScape
     *            是否横屏显示登录界面 *
     * @param isFixed
     *            是否定额支付 * * @return Intent
     */
    protected Intent getPayIntent(boolean isLandScape, boolean isFixed) {
        Bundle bundle = new Bundle();
        QihooPayInfo pay = getQihooPayInfo(isFixed);
        // 界面相关参数，360SDK界面是否以横屏显示。
        bundle.putBoolean(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE, isLandScape);
        // 可选参数，登录界面的背景图片路径，必须是本地图片路径
        bundle.putString(ProtocolKeys.UI_BACKGROUND_PICTRUE, "");
        // *** 以下非界面相关参数 ***
        // 设置QihooPay中的参数。
        // 必需参数，用户access token，要使用注意过期和刷新问题，最大64字符。
        bundle.putString(ProtocolKeys.ACCESS_TOKEN, access_token);
        // bundle.putString(ProtocolKeys.ACCESS_TOKEN, pay.getAccessToken());
        // 必需参数，360账号id。
        bundle.putString(ProtocolKeys.QIHOO_USER_ID, pay.getQihooUserId());
        // 必需参数，所购买商品金额, 以分为单位。金额大于等于100分，360SDK运行定额支付流程； 金额数为0，360SDK运行不定额支付流程。
        bundle.putString(ProtocolKeys.AMOUNT, pay.getMoneyAmount());
        // 必需参数，人民币与游戏充值币的默认比例，例如2，代表1元人民币可以兑换2个游戏币，整数。
        bundle.putString(ProtocolKeys.RATE, pay.getExchangeRate());
        // 必需参数，所购买商品名称，应用指定，建议中文，最大10个中文字。
        bundle.putString(ProtocolKeys.PRODUCT_NAME, pay.getProductName());
        // 必需参数，购买商品的商品id，应用指定，最大16字符。
        bundle.putString(ProtocolKeys.PRODUCT_ID, pay.getProductId());
        // 必需参数，应用方提供的支付结果通知uri，最大255字符。360服务器将把支付接口回调给该uri，具体协议请查看文档中，支付结果通知接口–应用服务器提供接口。
        bundle.putString(ProtocolKeys.NOTIFY_URI, pay.getNotifyUri());
        // 必需参数，游戏或应用名称，最大16中文字。
        bundle.putString(ProtocolKeys.APP_NAME, pay.getAppName());
        // 必需参数，应用内的用户名，如游戏角色名。 若应用内绑定360账号和应用账号，则可用360用户名，最大16中文字。（充值不分区服，充到统一的用户账户，各区服角色均可使用）。
        bundle.putString(ProtocolKeys.APP_USER_NAME, pay.getAppUserName());
        // 必需参数，应用内的用户id。 // 若应用内绑定360账号和应用账号，充值不分区服，充到统一的用户账户，各区服角色均可使用，则可用360用户ID最大32字符。
        bundle.putString(ProtocolKeys.APP_USER_ID, pay.getAppUserId());
        // 必需参数，应用订单号，应用内必须唯一，最大32字符。
        bundle.putString(ProtocolKeys.APP_ORDER_ID, pay.getAppOrderId());
        // 可选参数，应用扩展信息1，原样返回，最大255字符。
        bundle.putString(ProtocolKeys.APP_EXT_1, pay.getAppExt1());
        // 可选参数，应用扩展信息2，原样返回，最大255字符。
        bundle.putString(ProtocolKeys.APP_EXT_2, pay.getAppExt2());
        Intent intent = new Intent(this, ContainerActivity.class);
        intent.putExtras(bundle);
        return intent;
    }

    private QihooPayInfo getQihooPayInfo(boolean isFixed) {
        return new QihooPayInfo();
    }

    /** * 支付的回调 */
    protected IDispatcherCallback mPayCallback = new IDispatcherCallback() {
        @Override
        public void onFinished(String data) {
            Log.d(TAG, "mPayCallback, data is " + data);
            if (TextUtils.isEmpty(data)) {
                return;
            }
            boolean isCallbackParseOk = false;
            JSONObject jsonRes;
            try {
                jsonRes = new JSONObject(data);
                // error_code 状态码： 0 支付成功， -1 支付取消， 1 支付失败， -2 支付进行中。 // error_msg 状态描述
                int errorCode = jsonRes.optInt("error_code");
                isCallbackParseOk = true;
                switch (errorCode) {
                case 0:
                case 1:
                case -1:
                case -2: {
                    isAccessTokenValid = true;
                    String errorMsg = jsonRes.optString("error_msg");
                    Toast.makeText(MainActivity.this, "pay_callback_toast + " + errorMsg, Toast.LENGTH_SHORT).show();
                }
                    break;
                case 4010201:
                    isAccessTokenValid = false;
                    Toast.makeText(MainActivity.this, "R.string.access_token_invalid", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
                }

            } catch (JSONException e) {
                e.printStackTrace();
            } // 用于测试数据格式是否异常。
            if (!isCallbackParseOk) {
                Toast.makeText(MainActivity.this, "getString(R.string.data_format_error)", Toast.LENGTH_LONG).show();
            }
        }
    };

}
